/*
Language: JSON
Description: JSON (JavaScript Object Notation) is a lightweight data-interchange format.
Author: Ivan Sagalaev <maniac@softwaremaniacs.org>
Website: http://www.json.org
Category: common, protocols
*/

export default function (hljs) {
    var LITERALS = {
        literal: 'true false null'
    };
    var ALLOWED_COMMENTS = [hljs.C_LINE_COMMENT_MODE, hljs.C_BLOCK_COMMENT_MODE];
    var TYPES = [hljs.QUOTE_STRING_MODE, hljs.C_NUMBER_MODE];
    var VALUE_CONTAINER = {
        end: ',',
        endsWithParent: true,
        excludeEnd: true,
        contains: TYPES,
        keywords: LITERALS
    };
    var OBJECT = {
        begin: '{',
        end: '}',
        contains: [
            {
                className: 'attr',
                begin: /"/,
                end: /"/,
                contains: [hljs.BACKSLASH_ESCAPE],
                illegal: '\\n'
            },
            hljs.inherit(VALUE_CONTAINER, {
                begin: /:/
            })
        ].concat(ALLOWED_COMMENTS),
        illegal: '\\S'
    };
    var ARRAY = {
        begin: '\\[',
        end: '\\]',
        contains: [hljs.inherit(VALUE_CONTAINER)],
        // inherit is a workaround for a bug that makes shared modes with endsWithParent compile only the ending of one of the parents
        illegal: '\\S'
    };
    TYPES.push(OBJECT, ARRAY);
    ALLOWED_COMMENTS.forEach(function (rule) {
        TYPES.push(rule);
    });
    return {
        name: 'JSON',
        contains: TYPES,
        keywords: LITERALS,
        illegal: '\\S'
    };
}
